package com.wjm.collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Data:2022年07月07日
 * Author:wjm
 * Content: Comparable【内部比较器】
 *
 *
 *  Comparable【内部比较器】
 *             此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序，
 *             类的 compareTo 方法被称为它的自然比较方法。是用来设置比较规则的，规则是
 *             写在类的内部的所以叫内部比较器
 *
 *             Class Student implaments Comparable<Student>{
 *                 int age;
 *                 // 设置比较规则
 *                 @Override
 *                 public int comparTo(Student s){
 *                     return this.age - s.age;
 *                 }
 *             }
 *
 *             调用的比较方法已经在自定义类中撰写，所以使用集合的sort方法进行排序时，只需要传入当前类的集合即可！
 *             Collections.sort(list);
 *
 *     compareTo方法的返回值是int类型，比较结果只看正负和是否为0，与值的大小无关
 *        返回的值 > 0 ,正序    (当前对象-比较对象之后的值 > 0 ,正序)
 *        返回的值 =0 , 相同    (当前对象-比较对象之后的值 =0 , 相同)
 *        返回的值 < 0 ,倒序    (当前对象-比较对象之后的值 < 0 ,倒序)
 *
 */
public class ComparableDemo {
    public static void main(String[] args) {
        //创建集合
        List<Student> list = new ArrayList<>();
        //添加元素
        Collections.addAll(list,new Student("wjm",20));
        Collections.addAll(list,new Student("欧文",30));
        Collections.addAll(list,new Student("詹姆斯",36));
        Collections.addAll(list,new Student("库里",32));
        //进行排序
        Collections.sort(list);
        System.out.println(list);
    }
}


//创建一个类实现Comparable接口
class Student implements Comparable<Student>{

    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /**
     *  重写的Comparable【内部比较器】的compareTo的比较方法设置比较规则
     * @param s 传入Student对象
     * @return 返回int类型的值
     *
     *  说明：
     *  compareTo方法的返回值是int类型，比较结果只看正负和是否为0，与值的大小无关
     *   返回的值 > 0 ,正序
     *   返回的值 =0 , 相同
     *   返回的值 < 0 ,倒序
     */
    @Override
    public int compareTo(Student s) {
        return this.age - s.age;
    }
}